﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ShuticsBiz;
using ShuticsEntities;
using System.Media;
using System.Data.Objects.DataClasses;
using System.Configuration;
using System.Data.EntityClient;
using System.Data.Common;
using Microsoft.Reporting.WinForms;

namespace TPDiseño2011
{
    public partial class frmEmitirOrdenDeMerito : Form
    {
        private string usuario;
        public event EventHandler VolverTabInicio;
        List<Evaluacion> evaluaciones;
        Puesto puestoSeleccionado;

        public frmEmitirOrdenDeMerito(string usuario)
        {
            InitializeComponent();
            this.usuario = usuario;
        }

        #region Métodos pnlBusqueda
        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            SetearHabilitacionFiltros(true);
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            Buscar();
        }

        private void Buscar()
        {
            if (txtFiltroCodigo.Text == String.Empty && txtFiltroPuesto.Text == String.Empty && txtFiltroEmpresa.Text == String.Empty)
            {
                lblErrorFiltros.Visible = true;
            }
            else
            {
                SetearHabilitacionFiltros(false);
                dgvPuestos.AutoGenerateColumns = false;
                dgvPuestos.DataSource = new BindingList<Puesto>(ControlPuesto.Buscar(txtFiltroEmpresa.Text, txtFiltroPuesto.Text, txtFiltroCodigo.Text).OrderByDescending(c => c.Codigo).ToList());
            }
        }

        private void SetearHabilitacionFiltros(bool habilitado)
        {
            txtFiltroCodigo.Enabled = habilitado;
            txtFiltroPuesto.Enabled = habilitado;
            txtFiltroEmpresa.Enabled = habilitado;
            btnBuscar.Enabled = habilitado;
            btnLimpiar.Enabled = !habilitado;

            if (habilitado)
            {
                txtFiltroCodigo.Text = String.Empty;
                txtFiltroPuesto.Text = String.Empty;
                txtFiltroEmpresa.Text = String.Empty;
                txtFiltroCodigo.Focus();
            }

            lblErrorFiltros.Visible = false;
        }
        
        private void dgvPuestos_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (dgvPuestos.Columns[e.ColumnIndex].DataPropertyName.Contains("."))
            {
                e.Value = EvaluateValue(dgvPuestos.Rows[e.RowIndex].DataBoundItem, dgvPuestos.Columns[e.ColumnIndex].DataPropertyName);
            }
        }

        public string EvaluateValue(object obj, string property)
        {
            string prop = property;
            string ret = string.Empty;

            if (property.Contains("."))
            {
                prop = property.Substring(0, property.IndexOf("."));
                System.Reflection.PropertyInfo[] props = obj.GetType().GetProperties();

                foreach (System.Reflection.PropertyInfo propa in props)
                {
                    object obja = propa.GetValue(obj, new object[] { });

                    //Si el tipo de objeto es la lista de evaluaciones del puesto, y la propiedad es count, lo mostramos en pantalla
                    if (obja != null && obja is EntityCollection<Evaluacion> && property.Substring(property.IndexOf(".") + 1).Equals("Count"))
                    {
                        ret = ((EntityCollection<Evaluacion>)obja).Count.ToString();
                        break;
                    }

                    if (obja != null && obja.GetType().Name.Contains(prop))
                    {
                        ret = EvaluateValue(obja, property.Substring(property.IndexOf(".") + 1));
                        break;
                    }
                }
            }
            else
            {
                System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(prop);
                ret = pi.GetValue(obj, new object[] { }).ToString();
            }

            return ret;
        }
        #endregion pnlBusqueda

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            puestoSeleccionado = (Puesto)(dgvPuestos.CurrentRow.DataBoundItem);

            if (puestoSeleccionado.Evaluaciones.Count == 0)
            {
                MessageBox.Show("El puesto \"" + puestoSeleccionado.Nombre + "\" no posee evaluaciones.", Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                txtCodigo.Text = puestoSeleccionado.Codigo;
                txtEmpresa.Text = puestoSeleccionado.Empresa.Nombre;
                txtPuesto.Text = puestoSeleccionado.Nombre;

                evaluaciones = puestoSeleccionado.Evaluaciones.OrderBy(ev => ev.Fecha).ToList();
                for (int i = 0; i < evaluaciones.Count; i++)
                {
                    List<int> informacion = ControlEvaluacion.ObtenerInformacionDeEvaluacion(evaluaciones[i]);

                    dgvEvaluaciones.Rows.Add();
                    ((DataGridViewTextBoxCell)dgvEvaluaciones.Rows[i].Cells[1]).Value = evaluaciones[i].Fecha;
                    ((DataGridViewTextBoxCell)dgvEvaluaciones.Rows[i].Cells[2]).Value = evaluaciones[i].CantidadCandidatosEvaluados;
                    ((DataGridViewTextBoxCell)dgvEvaluaciones.Rows[i].Cells[3]).Value = informacion[0];
                    ((DataGridViewTextBoxCell)dgvEvaluaciones.Rows[i].Cells[4]).Value = informacion[1];
                    ((DataGridViewTextBoxCell)dgvEvaluaciones.Rows[i].Cells[5]).Value = informacion[2];
                }

                wizard1.SelectedIndex = wizard1.SelectedIndex + 1;
                this.AcceptButton = btnEmitirOrden;
                this.CancelButton = btnCancelar;
            }
        }

        private void codigo_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
        {
            toolTipCodigo.Show("Sólo se pueden caracteres con el formato [AAAA9999]", (MaskedTextBox)sender, 0, 20, 2000);
        }
        
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Salir();
        }

        private void Salir()
        {
            if (VolverTabInicio != null)
            {
                VolverTabInicio(this, null);
            }
            this.Close();
        }

        private void frmEmitirOrdenDeMerito_Activated(object sender, EventArgs e)
        {
            this.txtFiltroCodigo.Focus();
        }

        private void btnSeleccionarTodo_Click(object sender, EventArgs e)
        {
            bool seleccionarTodo = btnSeleccionarTodo.Text.Equals("Seleccionar Todo") ? true : false;

            foreach (DataGridViewRow row in dgvEvaluaciones.Rows)
            {
                ((DataGridViewCheckBoxCell)row.Cells[0]).Value = seleccionarTodo;
            }

            if (seleccionarTodo)
            {
                btnSeleccionarTodo.Text = "Deseleccionar Todo";
            }
            else
            {
                btnSeleccionarTodo.Text = "Seleccionar Todo";
            }
        }

        private void dgvPuestos_DataSourceChanged(object sender, EventArgs e)
        {
            bool habilitado = ((BindingList<Puesto>)dgvPuestos.DataSource).Count > 0;
            btnSiguiente.Enabled = habilitado;
        }

        private void btnEmitirOrden_Click(object sender, EventArgs e)
        {
            try
            {
<<<<<<< .mine
                List<Evaluacion> evaluacionesSeleccionadas = new List<Evaluacion>();
                lblSeleccionarEvaluacion.Visible = false;
=======
                if ((dgvEvaluaciones.Rows[i].Cells[0].Value != null) && ((bool)(dgvEvaluaciones.Rows[i].Cells[0].Value)))
                {
                    evaluacionesSeleccionadas.Add(evaluaciones[i]);
                }
            }
            
            List<Cuestionario> cuestionarios = ControlCuestionario.ObtenerCuestionariosByEvaluaciones(evaluacionesSeleccionadas);
            
            List<Cuestionario> cuestConOrdenDeMerito = new List<Cuestionario>();
            List<Cuestionario> cuestCompletos = new List<Cuestionario>();
            List<Cuestionario> cuestIncompletos = new List<Cuestionario>();
            List<Cuestionario> cuestSinContestar = new List<Cuestionario>();
>>>>>>> .r77

<<<<<<< .mine
                for (int i = 0; i < evaluaciones.Count; i++)
=======
            foreach (Cuestionario c in cuestionarios)
            {
                if (c.Estado.Nombre.Equals("Activo") || c.Estado.Nombre.Equals("En proceso"))
                {
                    continue;
                }

                if (c.Estado.Nombre == "Completo")
>>>>>>> .r77
                {
                    if ((dgvEvaluaciones.Rows[i].Cells[0].Value != null) && ((bool)(dgvEvaluaciones.Rows[i].Cells[0].Value)))
                    {
                        evaluacionesSeleccionadas.Add(evaluaciones[i]);
                    }
                }

                if (evaluacionesSeleccionadas.Count == 0)
                {
<<<<<<< .mine
                    throw new Exception();
=======
                    if (c.Estado.Nombre == "Incompleto")
                    {
                        cuestIncompletos.Add(c);
                    }
                    else
                    {
                        cuestSinContestar.Add(c);
                    }
>>>>>>> .r77
                }

                List<Cuestionario> cuestionarios = ControlCuestionario.ObtenerCuestionariosByEvaluaciones(evaluacionesSeleccionadas);

                frmReporteOrdenDeMerito reporte = new frmReporteOrdenDeMerito(puestoSeleccionado, cuestionarios, usuario);
                reporte.ShowDialog();
                Salir();
            }
<<<<<<< .mine
            catch (Exception)
            {
                lblSeleccionarEvaluacion.Visible = true;
            }
=======

            MessageBox.Show("Orden de merito: " + cuestConOrdenDeMerito.Count.ToString() + " cuestionarios.\nSolo completos: " + cuestCompletos.Count.ToString() + " cuestionarios.\nCuestionarios incompletos: " + cuestIncompletos.Count.ToString() + " cuestionarios.\nCuestionarios sin contestar: " + cuestSinContestar.Count.ToString() + " cuestionarios.", Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information);

            /*fmCristalReport Reporte;
            Reporte = new fmCristalReport();
            Reporte.ShowDialog();
        	*/
>>>>>>> .r77
        }
    }
}
